import json

from rest_framework import serializers


# 序列化，存储都用json格式展示 而非json串
class NestedJSONField(serializers.Field):
    def to_internal_value(self, data):
        # 当从请求体中接收数据时，将字符串反序列化为Python对象
        # print("to_internal_value")
        if isinstance(data, str):
            return data
        else:
            data = json.dumps(data)
            return data  # 如果不是字符串，则直接返回（注意：这可能会引发错误，取决于你的需求）

    def to_representation(self, value):
        # 当序列化对象以返回给客户端时，字符串转为json格式
        if isinstance(value, (dict, list)):
            return value
        return json.loads(value)  # 如果是字符串则转为json格式


class BaseModelSerializer(serializers.ModelSerializer):
    create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', read_only=True)
    update_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', read_only=True)

    class Meta:
        abstract = True  # 标记为抽象基类，这样它不会被直接实例化
        extra_kwargs = {
            'create_time': {'read_only': True},  # 标记为只读，这样就不会尝试在验证或创建时设置它
            'update_time': {'read_only': True},  # 同上
        }


class BaseNestedFieldsModelSerializer(BaseModelSerializer):
    request_header = NestedJSONField(required=False, allow_null=True)
    request_param = NestedJSONField(required=False, allow_null=True)
    request_data_params = NestedJSONField(required=False, allow_null=True)
    request_assert = NestedJSONField(required=False, allow_null=True)
    parameter_extraction = NestedJSONField(required=False, allow_null=True)

    class Meta:
        abstract = True  # 标记为抽象类，不会被直接实例化
